<?php
/*
 * Abstrakt klass för kryptering av lösenord med whirlpool
 * unikt salt skickas in och krypteras med en del av lösenordet
 */
abstract class PasswordHandler{

	private $algo = 'whirlpool';
	
	protected function GetEncryptedPassword($password, $salt){
		//Hämtar det unika saltet	
		$salt = $this->GenerateSalt($password, $salt);
		
		//Delar lösenordet i 2 delar	
		$passwordParts = str_split($password, (strlen($password)/2)+1);
		
		//hashar de 2 delarna av lösenordet, del 1 tillsammans med de första 20 tecknena av saltet 
		//och del 2 med nästkommande 10 tecken av saltet
		$passwordParts[0] = hash($this->algo, substr($salt,0,20).$passwordParts[0]);
		$passwordParts[1] = hash($this->algo, substr($salt,20,10).$passwordParts[1]);
		
		//hashar och returnerar en ny 128 bitars sträng med saltet och de båda delarna av lösenordet
		return hash($this->algo, $salt.'#'.$passwordParts[0].'&s!'.$passwordParts[1]);
	}
	
	//Genererar en hashad sträng med det unika saltet tillsammans med de sista 3 tecknena i $password
	private function GenerateSalt($password, $salt){
		return hash($this->algo, ($salt.(strlen($password)>3) ? substr($password,-3,3) : 'U9#'));
	}
}
?>